const compassUtil = require('../../utils/compass.js');

let compassChangeListener = null; // 全局变量保存监听器引用

Page({
  data: {
    direction: 0,        // 当前方向角度值
    directionValue: 0,   // 显示的角度值（取整）
    directionText: '北', // 方向文字
    showCalibrationTip: false, // 是否显示校准提示
    hasDeviceOrientation: true,  // 设备是否支持方向传感器
    degreeLines: [], // 角度刻度线数据
    mainDegrees: [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330], // 主要刻度角度
    latitude: '23°1\'26\"', // 纬度
    longitude: '113°18\'47\"' // 经度
  },

  isListenerSetUp: false, // 标记监听器是否已设置

  onLoad: function() {
    // 生成刻度线数据
    this.generateDegreeLines();
    
    // 设置罗盘监听器
    this.setupSimpleCompassListener();
    
    // 尝试获取位置
    this.getLocation();
  },

  onShow: function() {
    // 页面显示时设置监听器
    if (!this.isListenerSetUp) {
      this.setupSimpleCompassListener();
    }
  },

  onHide: function() {
    // 页面隐藏时停止监听方向变化
    this.removeListeners();
  },

  onUnload: function() {
    // 页面卸载时停止监听方向变化
    this.removeListeners();
  },

  // 移除所有监听器
  removeListeners: function() {
    try {
      // 移除方向监听器
      if (compassChangeListener) {
        wx.offCompassChange(compassChangeListener);
        compassChangeListener = null;
      }
      this.isListenerSetUp = false;
      console.log('已移除所有监听器');
    } catch (error) {
      console.error('移除监听器失败', error);
    }
  },

  // 使用简单方法设置罗盘监听器
  setupSimpleCompassListener: function() {
    const that = this;
    
    try {
      // 如果已经设置过监听器，先移除
      if (compassChangeListener) {
        wx.offCompassChange(compassChangeListener);
      }
      
      // 定义监听器回调函数
      compassChangeListener = function(res) {
        if (res && res.direction !== undefined) {
          // 获取罗盘方向数据
          let direction = res.direction;
          
          // 处理方向数据
          const directionInfo = compassUtil.getDirectionInfo(direction);
          
          that.setData({
            direction: direction,
            directionValue: directionInfo.value,
            directionText: directionInfo.text,
            showCalibrationTip: false
          });
        }
      };
      
      // 添加监听器
      wx.onCompassChange(compassChangeListener);
      this.isListenerSetUp = true;
      console.log('罗盘监听器设置成功');
    } catch (error) {
      console.error('设置罗盘监听器失败', error);
      this.isListenerSetUp = false;
    }
  },

  // 生成刻度线数据
  generateDegreeLines: function() {
    const lines = [];
    // 每1度生成一个刻度线，让刻度更密集
    for (let i = 0; i < 360; i++) {
      const degree = i;
      // 判断是否为主刻度（30度的倍数）
      const isMain = this.data.mainDegrees.includes(degree);
      // 生成刻度线数据
      lines.push({
        degree: degree,
        isMain: isMain,
        style: `transform: rotate(${degree}deg) translateX(-50%);` // 设置旋转角度
      });
    }
    this.setData({
      degreeLines: lines
    });
  },

  // 获取当前位置
  getLocation: function() {
    const that = this;
    wx.getLocation({
      type: 'gcj02',
      success: function(res) {
        // 将经纬度转换为度分秒格式
        const latitudeStr = that.convertToDMS(res.latitude, true);
        const longitudeStr = that.convertToDMS(res.longitude, false);
        
        that.setData({
          latitude: latitudeStr,
          longitude: longitudeStr
        });
      },
      fail: function(err) {
        console.error('获取位置失败', err);
        // 失败后主动请求授权
        that.requestLocationPermission();
      }
    });
  },

  // 请求位置权限
  requestLocationPermission: function() {
    const that = this;
    wx.getSetting({
      success(res) {
        // 如果未授权，则打开设置页面
        if (!res.authSetting['scope.userLocation']) {
          wx.showModal({
            title: '需要位置权限',
            content: '指南针需要获取您的位置才能显示经纬度信息，请点击"确定"前往设置',
            confirmText: '去设置',
            cancelText: '取消',
            success(modalRes) {
              if (modalRes.confirm) {
                wx.openSetting({
                  success(settingRes) {
                    if (settingRes.authSetting['scope.userLocation']) {
                      // 权限获取成功，重新获取位置
                      that.getLocation();
                    }
                  }
                });
              }
            }
          });
        }
      }
    });
  },

  // 将十进制经纬度转换为度分秒格式
  convertToDMS: function(decimal, isLatitude) {
    const absolute = Math.abs(decimal);
    const degrees = Math.floor(absolute);
    const minutesNotTruncated = (absolute - degrees) * 60;
    const minutes = Math.floor(minutesNotTruncated);
    const seconds = Math.floor((minutesNotTruncated - minutes) * 60);
    
    let result = degrees + '°' + minutes + '\'' + seconds + '"';
    
    // 加上方向标识
    if (isLatitude) {
      return result; // 直接返回数值，不加"北纬"文字
    } else {
      return result; // 直接返回数值，不加"东经"文字
    }
  },

  // 点击屏幕时显示校准提示
  onTapScreen: function() {
    this.setData({
      showCalibrationTip: true
    });
    
    // 3秒后自动隐藏提示
    setTimeout(() => {
      this.setData({
        showCalibrationTip: false
      });
    }, 3000);
  }
}); 